﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyNganHangDe.DAL.Models;

namespace QuanLyNganHangDe.BLL
{
    partial class BizHocPhan
    {
        public static object GetListHocPhanForCbx(DonViPhuTrach donVi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                if (donVi != null)
                {
                    var ds = from e in context.HocPhanDbSet
                             where e.DonViPhuTrach.MaDonVi == donVi.MaDonVi
                             select new { MaHocPhan = e.MaHocPhan, TenHocPhan = e.MaHocPhan + " - " + e.TenHocPhan, DonViPhuTrach = e.DonViPhuTrach };
                    return ds.ToList();
                }
                else
                    return null;
            }
        }
        public static List<HocPhan> GetListHocPhan(DonViPhuTrach donVi = null)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                if (donVi != null)
                    return context.HocPhanDbSet.Where(e => e.DonViPhuTrach.MaDonVi == donVi.MaDonVi).OrderBy(e => e.MaHocPhan).ToList();
                else
                    return (from e in context.HocPhanDbSet
                            orderby e.TenHocPhan ascending
                            select e).ToList();
            }
        }

        public static List<string> GetListHocPhanString(DonViPhuTrach donVi = null)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                if (donVi != null)
                    return context.HocPhanDbSet.Where(e => e.DonViPhuTrach.MaDonVi == donVi.MaDonVi).Select(e => e.MaHocPhan + ";" + e.TenHocPhan).ToList();
                else
                    return (from e in context.HocPhanDbSet
                            orderby e.MaHocPhan ascending
                            select e.MaHocPhan + "-" + e.TenHocPhan).ToList();
            }
        }

        public static void AddNew(string maDonVi, string tenDonVi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var count = context.DonViPhuTrachDbSet.Count(e => e.MaDonVi == maDonVi || e.TenDonVi == tenDonVi);
                if (count != 0)
                    throw new Exception("Đã có đơn vị phụ trách với mã đơn vị hoặc tên đơn vị này");
                try
                {
                    var x = new DonViPhuTrach { MaDonVi = maDonVi, TenDonVi = tenDonVi };
                    context.DonViPhuTrachDbSet.Add(x);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Lỗi xử lý cơ sở dữ liệu " + exc.Message, exc.InnerException);
                }
            }
        }

        /// <summary>
        /// Đổi tên loại hình đào tạo
        /// </summary>
        /// <param name="maLoaiHinh"></param>
        /// <param name="tenLoaiHinh"></param>
        public static void Update(string maDonVi, string tenDonVi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var x = context.DonViPhuTrachDbSet.Where(e => e.MaDonVi == maDonVi).FirstOrDefault();
                if (x == null)
                    throw new Exception("Không tìm thấy đơn vị phụ trách");
                var count = context.DonViPhuTrachDbSet.Count(e => e.MaDonVi != maDonVi && e.TenDonVi == tenDonVi);
                if (count != 0)
                    throw new Exception("Đã có tên đơn vị này hệ thống");
                try
                {
                    x.TenDonVi = tenDonVi;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Lỗi xử lý cơ sở dữ liệu " + exc.Message, exc.InnerException);
                }
            }
        }

        public static bool Delete(HocPhan x)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == x.MaHocPhan).FirstOrDefault();
                    if (oX == null)
                        throw new Exception("Không tìm thấy học phần");
                    if (oX.KhoiCollection.Count > 0)
                        return false;
                    context.HocPhanDbSet.Remove(oX);
                    context.SaveChanges();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

        internal static bool AddHocPhan(HocPhan hp)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == hp.MaHocPhan).FirstOrDefault();
                    if (oX != null)
                        throw new Exception("Học phần này đã tồn tại");
                    context.HocPhanDbSet.Add(hp);
                    context.SaveChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        internal static bool UpdateHocPhan(HocPhan hp, string maHocPhanCu = null)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == hp.MaHocPhan).FirstOrDefault();
                    if (oX == null)
                    {
                        oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == maHocPhanCu).FirstOrDefault();
                        if (oX == null)
                            throw new Exception("Học phần không tồn tại");
                    }
                    oX.MaHocPhan = hp.MaHocPhan;
                    oX.TenHocPhan = hp.TenHocPhan;
                    oX.ThoiGianLamBai = hp.ThoiGianLamBai;
                    oX.SoTinChi = hp.SoTinChi;
                    oX.MaDonVi = hp.MaDonVi;
                    oX.DuocSuDungTaiLieu = hp.DuocSuDungTaiLieu;
                    context.SaveChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        internal static HocPhan GetHocPhan(string hp)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == hp).FirstOrDefault();
                    if (oX == null)
                        throw new Exception("Học phần không tồn tại");
                    return oX;
                }
                catch
                {
                    return null;
                }
            }
        }

        /// <summary>
        /// [0]: Tổng số khối
        /// [1]: Số câu hỏi ít nhất trong khổi
        /// [2]: Số câu hỏi nhiều nhất trong khối
        /// [3]: Số đề đã khai thác
        /// </summary>
        /// <param name="hp"></param>
        /// <returns></returns>
        internal static List<int> ThongTinChiTiet(HocPhan hp, int vaitro)
        {
            List<int> rs = new List<int>();
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == hp.MaHocPhan).FirstOrDefault();
                    if (oX == null)
                        throw new Exception("Học phần không tồn tại");
                    //rs.Add(oX.KhoiCollection.Count());
                    int min = 10000, max = 0, soKhoi = 0;
                    foreach (var item in oX.KhoiCollection)
                    {

                        var count = item.CauHoiCollection.Where(e => vaitro != (int)QuanLyNganHangDe.DAL.Models.NguoiSuDung.VAITRO.QuanTriHeThong ? e.ConSuDung : true).Count();
                        if (count > 0)
                        {
                            soKhoi++;
                            if (min > count)
                                min = count;
                            if (max < count)
                                max = count;
                            //min = min == -1 ? count : min;
                        }
                    }
                    rs.Add(soKhoi);
                    rs.Add(min == 10000 ? 0 : min);
                    rs.Add(max);
                    if (oX.DeInRaCollection != null)
                        rs.Add(oX.DeInRaCollection.Count());
                    else
                        rs.Add(0);
                    return rs;
                }
                catch
                {
                    return null;
                }
            }
        }

        internal static void AddHocPhan(string maHP, string tenHP, int soTC, int thoiGian, bool duocSDTL, string tenKhoa)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                try
                {
                    var oX = context.HocPhanDbSet.Where(e => e.MaHocPhan == maHP).FirstOrDefault();
                    if (oX != null)
                        throw new Exception("Học phần đã tồn tại");
                    var khoa = context.DonViPhuTrachDbSet.Where(e => e.TenDonVi == tenKhoa).FirstOrDefault();
                    if (khoa == null)
                    {
                        khoa = new DonViPhuTrach();
                        khoa.TenDonVi = tenKhoa;
                        khoa.MaDonVi = Guid.NewGuid().ToString();
                        context.DonViPhuTrachDbSet.Add(khoa);
                        context.SaveChanges();
                    }
                    HocPhan hp = new HocPhan();
                    hp.MaHocPhan = maHP;
                    hp.TenHocPhan = tenHP;
                    hp.SoTinChi = soTC;
                    hp.ThoiGianLamBai = thoiGian;
                    hp.MaDonVi = khoa.MaDonVi;
                    hp.DuocSuDungTaiLieu = duocSDTL;
                    context.HocPhanDbSet.Add(hp);
                    context.SaveChanges();
                }
                catch
                {
                    throw;
                }
            }
        }
    }
}
